﻿#include "ProgressBar.h"
#include <QPainter>
#include <QFontMetrics>

ProgressBar::ProgressBar(QWidget *parent)
    : QWidget(parent), m_foregroundColor(Qt::blue), m_backgroundColor(Qt::lightGray), m_borderRadius(5), m_progress(0) {}

void ProgressBar::setForegroundColor(const QColor &color) {
    m_foregroundColor = color;
    update(); // 触发重绘
}

void ProgressBar::setBackgroundColor(const QColor &color) {
    m_backgroundColor = color;
    update(); // 触发重绘
}

void ProgressBar::setBorderRadius(int radius) {
    m_borderRadius = radius;
    update(); // 触发重绘
}

void ProgressBar::setProgress(int value) {
    m_progress = qBound(0, value, 100); // 确保进度值在 0-100 范围内
    update(); // 触发重绘
}

int ProgressBar::getProgress() const {
    return m_progress;
}

void ProgressBar::paintEvent(QPaintEvent *event) {
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿

    // 绘制背景
    painter.setPen(Qt::NoPen); // 无边框
    painter.setBrush(m_backgroundColor); // 设置背景色
    painter.drawRoundedRect(rect(), m_borderRadius, m_borderRadius); // 绘制圆角矩形

    // 绘制前景（进度条）
    int width = (m_progress * this->width()) / 100; // 根据进度计算宽度
    QRect progressRect(0, 0, width, this->height()); // 前景矩形区域
    painter.setBrush(m_foregroundColor); // 设置前景色
    painter.drawRoundedRect(progressRect, m_borderRadius, m_borderRadius); // 绘制圆角矩形

    // 绘制进度文本
    QString progressText = QString("%1%").arg(m_progress); // 格式化文本
    QFont font = painter.font();
    font.setPointSize(10); // 设置字体大小
    painter.setFont(font);

    QFontMetrics metrics(font);
    int textWidth = metrics.horizontalAdvance(progressText); // 计算文本宽度
    int textHeight = metrics.height(); // 计算文本高度

    // 计算文本位置（居中）
    QRect textRect((this->width() - textWidth) / 2, (this->height() - textHeight) / 2, textWidth, textHeight);

    // 设置文本颜色（根据前景色自动调整）
    QColor textColor = (m_progress > 50) ? Qt::white : Qt::black; // 根据进度值选择文本颜色
    painter.setPen(textColor);
    painter.drawText(textRect, Qt::AlignCenter, progressText); // 绘制文本
}
